package game;

import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;

public class Map implements Serializable {

	// Players start values
	// private String playerDirection = "up";
	private ArrayList<Player> players = new ArrayList<Player>();
	private static Map map;
	private String wall = "w";
	private KeyClass ko;
	private ScoreList slist;
	
	public static Map getInstance(ObjectOutputStream out){
		if(map == null){
			map = new Map(out);
		}
		return map;
	}
	
	private Map(ObjectOutputStream out) {
		screen = new Screen(level);
		screen.setVisible(true);
		ko = new KeyClass(this, out);
		screen.addKeyListener(ko);
		slist = ScoreList.getInstance();
	}
	
	public void addPlayer(Player player){
		players.add(player);
		slist.addToScoreList(player);
		screen.addHero(player.getXpos(), player.getYpos());
		if(players.size()==1){
			ko.addPlayer(player);
		}
	}
	
	public void removePlayer(Player player){
		players.remove(player);
	}
	
	public ArrayList<Player> getPlayers()
	{
		return players;
	}

	public ScoreList getScorelist(){
		return slist;
	}
	
	public void setScoreList(ScoreList scoreList){
		this.slist = scoreList;
	}
	



	// level is defined column by column
	private String[][] level = {
			{ "w", "w", "w", "w", "w", "w", "w", "w", "w", "w", "w", "w", "w",
					"w", "w", "w", "w", "w", "w", "w" },
			{ "w", "e", "e", "e", "e", "e", "e", "e", "e", "w", "w", "e", "e",
					"e", "e", "e", "e", "e", "e", "w" },
			{ "w", "e", "w", "e", "e", "w", "e", "e", "w", "w", "w", "e", "w",
					"e", "e", "w", "e", "e", "w", "w" },
			{ "w", "e", "w", "e", "e", "w", "e", "e", "e", "w", "w", "e", "w",
					"e", "e", "w", "e", "e", "w", "w" },
			{ "w", "e", "e", "w", "e", "e", "e", "e", "e", "e", "e", "e", "e",
					"e", "e", "e", "e", "e", "e", "w" },
			{ "w", "e", "w", "e", "w", "e", "w", "e", "w", "e", "w", "e", "w",
					"e", "e", "w", "e", "e", "w", "w" },
			{ "w", "e", "w", "e", "e", "e", "e", "e", "w", "w", "w", "e", "w",
					"e", "e", "w", "e", "e", "w", "w" },
			{ "w", "e", "w", "e", "e", "e", "e", "e", "w", "e", "w", "e", "w",
					"e", "e", "w", "e", "e", "w", "w" },
			{ "w", "e", "e", "e", "w", "e", "w", "e", "e", "w", "e", "e", "w",
					"e", "e", "w", "e", "e", "e", "w" },
			{ "w", "e", "e", "e", "e", "e", "w", "e", "e", "w", "e", "e", "w",
					"e", "e", "w", "e", "e", "e", "w" },
			{ "w", "e", "w", "w", "e", "w", "w", "e", "e", "e", "e", "e", "e",
					"e", "e", "w", "e", "e", "w", "w" },
			{ "w", "e", "e", "w", "e", "w", "e", "e", "e", "e", "w", "e", "e",
					"e", "e", "w", "e", "e", "w", "w" },
			{ "w", "e", "e", "e", "e", "e", "e", "e", "e", "w", "w", "e", "w",
					"e", "e", "w", "e", "e", "w", "w" },
			{ "w", "e", "e", "e", "e", "e", "e", "e", "e", "e", "w", "e", "w",
					"e", "e", "w", "e", "e", "w", "w" },
			{ "w", "e", "e", "e", "e", "e", "e", "e", "e", "w", "e", "e", "e",
					"e", "e", "w", "e", "e", "w", "w" },
			{ "w", "e", "e", "w", "e", "e", "e", "e", "e", "e", "e", "e", "e",
					"e", "e", "e", "e", "e", "w", "w" },
			{ "w", "e", "e", "w", "e", "w", "w", "w", "e", "e", "w", "e", "w",
					"e", "e", "w", "w", "e", "w", "w" },
			{ "w", "e", "w", "e", "e", "e", "e", "e", "e", "w", "w", "e", "w",
					"e", "e", "e", "e", "e", "w", "w" },
			{ "w", "e", "e", "e", "w", "e", "e", "e", "w", "w", "e", "e", "w",
					"e", "e", "e", "e", "e", "e", "w" },
			{ "w", "w", "w", "w", "w", "w", "w", "w", "w", "w", "w", "w", "w",
					"w", "w", "w", "w", "w", "w", "w" }, };
	// level is defined column by column
	Screen screen;

	/**
	 * 
	 * @param me
	 * @param s
	 */

	
	/**
	 * 
	 * @param direction
	 */
	public void playerMoved(String direction, Player player) {
		player.setDirection(direction);
		int x = player.getXpos(), y = player.getYpos();
		if (direction.equals("right")) {
			x = player.getXpos() + 1;
		}
		
		if (direction.equals("left")) {
			x = player.getXpos() - 1;
		}
		
		if (direction.equals("up")) {
			y = player.getYpos() - 1;
		}
		
		if (direction.equals("down")) {
			y = player.getYpos() + 1;
		}
		
		if (level[x][y].equals(wall)) {
			player.subOnePoint();
			slist.updateAll();
		} else {
			player.addOnePoint();
			slist.updateAll();
			screen.movePlayerOnScreen(player.getXpos(), player.getYpos(), x, y, player.getDirection());
			player.setXpos(x);
			player.setYpos(y);
		}
	}
	
	public void updateScoreList(ScoreList s){
		this.slist = s;
	}
	
	public boolean isWall(int x, int y){
		return level[x][y].equals(wall);
	}
}
